package com.zhuhjay.common.domain.controller;

import com.zhuhjay.common.utils.ServletUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Controller控制器的基层控制器, 作为类增强
 * @author ZhuHJay
 * @date 2022/3/28 15:56
 */
public abstract class BaseController {

    /** 将 @RequestBody 的信息传递到session中, 并且如果发现有密码, 那么就将密码隐藏 **/
    protected void sendBodyToSession(Object obj){
        // 将对象转换成json字符串儿
        // 使用正则表达式获取包含`password`关键字, 将其中的数据掉包
        String json = replaceStr(ServletUtils.writeObjectAsString(obj));
        // 使用该请求的url作为键, 防止请求数据乱窜
        // 将用户请求的信息暂存到session中, 然后传递给日志使用
        ServletUtils.getSession().setAttribute(ServletUtils.getRequest().getRequestURI(), json);
    }

    /** 对需要遮掩的字符串进行打码 **/
    private String replaceStr(String content){
        // 替换成如下字符串
        final String replaceToStr = "**马赛克**";
        // 正则表达式
        final String patternString = "assword\":\"([^\"]+)\"";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(content);
        List<String> replaceList = new ArrayList<>();
        // 记录需要替换的字符串数据
        // matcher.find(): 进行正则表达式的搜索, 找到匹配的位置
        while(matcher.find()) {
            // matcher.group(1): 根据正则表达式中获取到的元组信息进行获取
            // group(0): 代表整个正则表达式
            replaceList.add(matcher.group(1));
        }
        // 进行字符串替换
        for (String replace : replaceList) {
            content = content.replace(replace, replaceToStr);
        }
        return content;
    }

}
